home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / SourceCode / AdobeExamples / NX_Scroll / ScrollApp.m < prev    next >
Text File  |  1992-12-19  |  11KB  |  553 lines

  1.  
  2. /*
  3.  * (a)  (C) 1990 by Adobe Systems Incorporated. All rights reserved.
  4.  *
  5.  * (b)  If this Sample Code is distributed as part of the Display PostScript
  6.  *    System Software Development Kit from Adobe Systems Incorporated,
  7.  *    then this copy is designated as Development Software and its use is
  8.  *    subject to the terms of the License Agreement attached to such Kit.
  9.  *
  10.  * (c)  If this Sample Code is distributed independently, then the following
  11.  *    terms apply:
  12.  *
  13.  * (d)  This file may be freely copied and redistributed as long as:
  14.  *    1) Parts (a), (d), (e) and (f) continue to be included in the file,
  15.  *    2) If the file has been modified in any way, a notice of such
  16.  *      modification is conspicuously indicated.
  17.  *
  18.  * (e)  PostScript, Display PostScript, and Adobe are registered trademarks of
  19.  *    Adobe Systems Incorporated.
  20.  * 
  21.  * (f) THE INFORMATION BELOW IS FURNISHED AS IS, IS SUBJECT TO
  22.  *    CHANGE WITHOUT NOTICE, AND SHOULD NOT BE CONSTRUED
  23.  *    AS A COMMITMENT BY ADOBE SYSTEMS INCORPORATED.
  24.  *    ADOBE SYSTEMS INCORPORATED ASSUMES NO RESPONSIBILITY
  25.  *    OR LIABILITY FOR ANY ERRORS OR INACCURACIES, MAKES NO
  26.  *    WARRANTY OF ANY KIND (EXPRESS, IMPLIED OR STATUTORY)
  27.  *    WITH RESPECT TO THIS INFORMATION, AND EXPRESSLY
  28.  *    DISCLAIMS ANY AND ALL WARRANTIES OF MERCHANTABILITY, 
  29.  *    FITNESS FOR PARTICULAR PURPOSES AND NONINFRINGEMENT
  30.  *    OF THIRD PARTY RIGHTS.
  31.  */
  32.  
  33. /*
  34.  *    ScrollApp.m
  35.  *
  36.  *    This subclass of the application class performs the global
  37.  *    setup needed for the Scrolling application. The drawing
  38.  *    window is created.
  39.  *
  40.  *    Version:    2.0
  41.  *    Author:    Ken Anderson, Ken Fromm
  42.  *    History:
  43.  *            03-07-91        Added this comment.
  44.  */
  45.  
  46. #import "ScrollApp.h"
  47. #import "DocView.h"
  48. #import "DrawingView.h"
  49. #import "DrawingViewWraps.h"
  50. #import "EpsfParser.h"
  51. #import <objc/hashtable.h>        /* for NXCopyStringBuffer() */
  52. #import <appkit/Button.h>
  53. #import <appkit/Matrix.h>
  54. #import <appkit/OpenPanel.h>
  55. #import <appkit/ScrollView.h>
  56. #import <appkit/Window.h>
  57. #import <appkit/nextstd.h>
  58. #import <sys/param.h>
  59. #import <string.h>
  60.  
  61. static NXRect            windowRect = {150, 184, 550, 600};
  62.  
  63. @implementation ScrollApp
  64.  
  65. /*
  66. *    Allocate the memory for the user path description buffers. Create the
  67. *    window for drawing the image.
  68. */
  69. + new
  70. {
  71.     self = [super new];
  72.  
  73.     NX_MALLOC(drawBuffer.pts, float, PTS_UPATH_BUFFER);
  74.     NX_MALLOC(drawBuffer.ops, char, OPS_UPATH_BUFFER);
  75.  
  76.     windowBacking = NX_RETAINED;
  77.  
  78.     readerId = [EpsfParser  new];
  79.  
  80.     [self  createWindow:&windowRect];
  81.  
  82.     return self;
  83. }
  84.  
  85. /*
  86. *    Create the drawing window and place a scrollview as the content view.
  87. *    A DrawingView instance is placed as the DocView of the ScrollView.
  88. */
  89. - createWindow:(NXRect *) winRect
  90. {
  91.     NXRect    tempRect;
  92.  
  93.     windowId = [Window newContent:winRect
  94.             style:NX_TITLEDSTYLE
  95.             backing:windowBacking
  96.             buttonMask:NX_RESIZEBUTTONMASK
  97.             defer:NO];
  98.  
  99.     [Window  getContentRect:&tempRect  forFrameRect:winRect  style:NX_TITLEDSTYLE];
  100.     scrollviewId = [ScrollView newFrame:&tempRect];
  101.     [scrollviewId setBorderType:SCROLLVIEW_BORDER];
  102.  
  103.     drawingviewId = [[[DrawingView  newFrame:&tempRect]  setClipping:NO]  allocateGState];
  104.     docviewId = [[[[DocView new]  setClipping:NO]  allocateGState]  setScale:1.0];
  105.     [docviewId  setDrawView:drawingviewId];
  106.     [scrollviewId  setDocView:docviewId];
  107.  
  108.     /*
  109.     *    Important in 2.0 because it eliminates a problem in 2.0 that shifts the halftonephase
  110.     *    over by 1 extra pixel, causing a noticable aberration in a halftone during a scroll.
  111.     */
  112.     [[[docviewId  superview]  setFlipped:NO]  allocateGState];
  113.  
  114.     [[windowId setContentView:scrollviewId] free];
  115.  
  116.     [windowId makeFirstResponder:drawingviewId];
  117.     [windowId setDelegate:self];
  118.  
  119.     return self;
  120. }
  121.  
  122. /* The window will free the its subviews. */
  123. - free
  124. {
  125.     if (drawBuffer.pts)
  126.         NX_FREE(drawBuffer.pts);
  127.     if (drawBuffer.ops)
  128.         NX_FREE(drawBuffer.ops);
  129.  
  130.     [readerId  free];
  131.     [windowId  free];
  132.  
  133.     return [super free];
  134. }
  135.  
  136. - setMenuItem:anObject;
  137. {
  138.     menuitemId = anObject;
  139.  
  140.     return self;
  141. }
  142.  
  143. - setRedrawButton:anObject
  144. {
  145.     redrawButton = anObject;
  146.     methodsWindow = [redrawButton  window];
  147.  
  148.     return self;
  149. }
  150.  
  151. - redrawButton
  152. {
  153.     return redrawButton;
  154. }
  155.  
  156. - methodsWindow
  157. {
  158.     return methodsWindow;
  159. }
  160.  
  161. - setStatusMatrix:anObject
  162. {
  163.     statusmatrixId = anObject;
  164.  
  165.     return self;
  166. }
  167.  
  168. - getStatusMatrix
  169. {
  170.     return statusmatrixId;
  171. }
  172.  
  173. - setTimingMatrix:anObject
  174. {
  175.     timingmatrixId = anObject;
  176.  
  177.     return self;
  178. }
  179.  
  180. - getTimingMatrix
  181. {
  182.     return timingmatrixId;
  183. }
  184.  
  185. - setStrokingMatrix:anObject
  186. {
  187.     strokingmatrixId = anObject;
  188.  
  189.     return self;
  190. }
  191.  
  192. - getStrokingMatrix
  193. {
  194.     return strokingmatrixId;
  195. }
  196.  
  197. - setParameterMatrix:anObject
  198. {
  199.     parametermatrixId = anObject;
  200.  
  201.     return self;
  202. }
  203.  
  204. - getParameterMatrix
  205. {
  206.     return parametermatrixId;
  207. }
  208.  
  209. - setTypeOfDrawing:sender
  210. {
  211.     [drawingviewId  setTypeOfDrawing:sender];
  212.  
  213.     return self;
  214. }
  215.  
  216. - setSelectivity:sender
  217. {
  218.     [drawingviewId  setSelectivity:sender];
  219.  
  220.     return self;
  221. }
  222.  
  223. - setDrawingManner:sender
  224. {
  225.     [drawingviewId  setDrawingManner:sender];
  226.  
  227.     return self;
  228. }
  229.  
  230. - setParameterSetting:sender
  231. {
  232.     [drawingviewId  setParameterSetting:sender];
  233.  
  234.     return self;
  235. }
  236.  
  237. - setStroking:sender
  238. {
  239.     [drawingviewId  setStroking:sender];
  240.  
  241.     return self;
  242. }
  243.  
  244. - setWindowBacking:sender
  245. {
  246.     id        newWindow, oldContentView, tempView;
  247.  
  248.     char        *windowTitle;
  249.  
  250.     int        newBacking;
  251.  
  252.     NXRect    winFrame, contRect;
  253.  
  254.     if (!runningDrawModal)
  255.     {
  256.         if ([sender selectedRow] == 0)
  257.             newBacking = NX_RETAINED;
  258.         else
  259.             newBacking = NX_BUFFERED;
  260.  
  261.         if (windowBacking != newBacking)
  262.         {
  263.             [windowId  getFrame:&winFrame];
  264.             [Window  getContentRect:&contRect  forFrameRect:&winFrame
  265.                 style:[windowId  style]];
  266.             newWindow = [Window newContent:&contRect
  267.                 style:NX_TITLEDSTYLE
  268.                 backing:newBacking
  269.                 buttonMask:NX_RESIZEBUTTONMASK
  270.                 defer:NO];
  271.             [newWindow  setTitle:[windowId  title]];
  272.             [newWindow  display];
  273.             [newWindow makeKeyAndOrderFront:self];
  274.  
  275.             [windowId  disableDisplay];
  276.             tempView = [View new];
  277.             oldContentView = [windowId  setContentView:tempView];
  278.             [[newWindow setContentView:oldContentView] free];
  279.             [windowId  free];
  280.  
  281.             windowId = newWindow;
  282.             [windowId makeFirstResponder:drawingviewId];
  283.             [windowId setDelegate:self];
  284.  
  285.             windowBacking = newBacking;
  286.         }
  287.  
  288.         if (currentfile)
  289.         {
  290.             [drawingviewId  setFieldsMode:YES];
  291.             [windowId display];
  292.             [windowId makeKeyAndOrderFront:self];
  293.         }
  294.     }
  295.  
  296.     return self;
  297. }
  298.  
  299. - showWindow:sender
  300. {
  301.     if (currentfile)
  302.         [windowId makeKeyAndOrderFront:self];
  303.     
  304.     return self;
  305. }
  306.  
  307. /* This method changes the title of the menu cell according to the
  308. * value of the trace variable.
  309. */
  310. -setTracing:sender
  311. {
  312.     if (trace == NO)
  313.         [[sender selectedCell] setTitle:"Trace On"];
  314.     else
  315.         [[sender selectedCell] setTitle:"Trace Off"];
  316.  
  317.     trace = !trace;
  318.     
  319.     return self;
  320. }
  321.  
  322. - (BOOL) tracing;
  323. {
  324.     return trace;
  325. }
  326.  
  327. - zoom:sender
  328. {
  329.     [docviewId  zoom:sender];
  330.  
  331.     return self;
  332. }
  333.  
  334. - redrawAction:sender
  335. {
  336.     if (!runningDrawModal)
  337.         [redrawButton  performClick:self];
  338.     
  339.     return self;
  340. }
  341.  
  342. - redraw:sender
  343. {
  344.     NXRect    visRect;
  345.     
  346.     if (!runningDrawModal)
  347.     {
  348.         [drawingviewId  setFieldsMode:YES];
  349.         [drawingviewId  getVisibleRect:&visRect];
  350.         [drawingviewId  display:&visRect :1];
  351.     }
  352.  
  353.     return self;
  354. }
  355.  
  356. - displayFields:sender
  357. {
  358.     [drawingviewId  displayFields:sender];
  359.     
  360.     return self;
  361. }
  362.  
  363. - getDrawingView
  364. {
  365.     return drawingviewId;
  366. }
  367.  
  368. - getDocument
  369. {
  370.     return docviewId;
  371. }
  372.  
  373. - (UPath *) getUpathBuffer
  374. {
  375.     return &drawBuffer;
  376. }
  377.  
  378. /*
  379.  * Called by pressing Load... in the Main menu.
  380.  */
  381. - load:sender
  382. {
  383.     id                openpanelId, tempviewId, clipviewId;
  384.  
  385.     const char        *file;
  386.  
  387.     static const char *const        doctype[3] = {"ps", "eps", NULL};
  388.    
  389.        NXStream        *stream;
  390.  
  391.      NXPoint            viewPt, windowPt;
  392.  
  393.      NXRect            epsfBounds, viewFrame;
  394.  
  395.     openpanelId = [[OpenPanel new] allowMultipleFiles:NO];
  396.  
  397.     if ([openpanelId runModalForTypes:doctype])
  398.     {
  399.         file = [openpanelId filename];
  400.         if (!currentfile || strcmp(file, currentfile))
  401.         {
  402.             stream = NXMapFile(file, NX_READONLY);
  403.             if (stream)
  404.             {
  405.                 tempviewId = [View new];
  406.                 [windowId  setContentView:tempviewId];
  407.                 [self setName:file withParsing:YES];
  408.                 [windowId display];
  409.                 [windowId makeKeyAndOrderFront:self];
  410.                 NXPing();
  411.                 [[windowId  setContentView:scrollviewId]  free];
  412.  
  413.                 if ([readerId  readPSFromStream:stream])
  414.                 {
  415.                     [docviewId  scaleView:drawingviewId  withScale:1.0];
  416.                     [docviewId  setScale:1.0];
  417.                     [[docviewId  zoomControl]  selectCellWithTag:100];                
  418.  
  419.                     [readerId  getBounds:&epsfBounds];
  420.                     [drawingviewId  setDrawOrigin:&epsfBounds.origin];
  421.                     [drawingviewId  sizeTo:epsfBounds.size.width  :epsfBounds.size.height];
  422.  
  423.                     [self setName:file withParsing:NO];
  424.                     if (currentfile)
  425.                         NX_FREE(currentfile);
  426.                     currentfile = NXCopyStringBuffer(file);
  427.  
  428.                     [windowId disableDisplay];
  429.                         [docviewId  placeView:drawingviewId];
  430.  
  431.                         /* Scroll center of image to center of window. */
  432.                         [docviewId  getFrame:&viewFrame];
  433.                         viewPt.x = viewFrame.size.width/2;
  434.                         viewPt.y = viewFrame.size.height/2;
  435.                         [drawingviewId  convertPoint:&viewPt
  436.                                 fromView:docviewId];
  437.  
  438.                         [scrollviewId  getFrame:&viewFrame];
  439.                         windowPt.x = viewFrame.size.width/2;
  440.                         windowPt.y = viewFrame.size.height/2;
  441.                         [scrollviewId  convertPoint:&windowPt  toView:nil];
  442.  
  443.                         [docviewId  scrollPoint:&viewPt 
  444.                                 inView:drawingviewId  to:&windowPt];
  445.                     [windowId reenableDisplay];
  446.  
  447.                     [drawingviewId  setFieldsMode:YES];
  448.                     [windowId display];
  449.                 }
  450.                 else
  451.                 {
  452.                     [self setName:currentfile withParsing:NO];
  453.                     [windowId  display];
  454.                 }
  455.     
  456.                 NXCloseMemory(stream, NX_FREEBUFFER);
  457.             }
  458.             else
  459.                 NXRunAlertPanel("Load File", "Invalid File.  Cannot open.", 
  460.                     "OK", NULL, NULL);
  461.         }
  462.     }
  463.  
  464.     return self;
  465. }
  466.  
  467. /*
  468.  * Updates the name and directory of the document.
  469.  */
  470. - setName:(const char *)filename withParsing:(BOOL) flag
  471. {
  472.     int        len = 0;
  473.  
  474.     char        title[MAXPATHLEN+5];
  475.     
  476.     char        *simple_filename;
  477.  
  478.     if (filename && *filename)
  479.     {
  480.         if (flag)
  481.             strcpy(title, "parsing:");
  482.         else
  483.             title[0] = 0;
  484.  
  485.         simple_filename = strrchr(filename, '/');
  486.         if (simple_filename)
  487.         {
  488.             len = strlen(simple_filename);
  489.             simple_filename++;
  490.             strcat(title, simple_filename);
  491.             strcat(title, " \320 ");            /* \320 is a "long dash" */
  492.             strcatn(title, filename, strlen(filename) - len);
  493.         }
  494.         else
  495.             strcat(title, filename);    
  496.  
  497.         [windowId setTitle:title];
  498.         [menuitemId  setEnabled:YES];
  499.     }
  500.     else
  501.         [windowId setTitle:"Scrolling"];
  502.  
  503.     return self;
  504. }
  505.  
  506. /*
  507.  * Resizes the doc view and repositions the drawing view inside the doc view.
  508.  */
  509. - windowDidResize:sender
  510. {
  511.     [docviewId  placeView:drawingviewId];
  512.  
  513.     return self;
  514. }
  515.  
  516. - (int) runDrawModalSession:(NXModalSession *) session
  517. {
  518.     int            returnCode1, returnCode2;
  519.  
  520.     NXPoint        pt;
  521.     
  522.     NXEvent        *anEvent;
  523.  
  524.     runningDrawModal = YES;
  525.     returnCode1 = NX_RUNCONTINUES;
  526.     while (anEvent = [NXApp  getNextEvent:NX_MOUSEDOWNMASK  waitFor:0 
  527.         threshold:NX_RUNMODALTHRESHOLD])
  528.     {
  529.         if (anEvent->window == [methodsWindow windowNum])
  530.         {
  531.             redrawButton = [NXApp redrawButton];
  532.             pt = anEvent->location;
  533.             [[redrawButton superview] convertPoint:&pt fromView:nil];
  534.             if ([redrawButton  hitTest:&pt] == redrawButton)
  535.             {
  536.                 [redrawButton  performClick:self];
  537.                 returnCode1 = NX_RUNABORTED;
  538.             }
  539.         }
  540.     }
  541.     
  542.     returnCode2 =  [self  runModalSession:session];
  543.     runningDrawModal = NO;
  544.     
  545.     if (returnCode1 == NX_RUNABORTED)
  546.         return returnCode1;
  547.     else
  548.         return returnCode2;
  549. }
  550.  
  551. @end
  552.  
  553.